package 动态规划9月;
import java.util.*;
public class NC41最长无重复子数组0923 {




        /**
         *
         * @param arr int整型一维数组 the array
         * @return int整型
         */
        //双指针做法
        public  static int maxLength(int[] arr) {
            if (arr.length == 0)
                return 0;
            HashMap<Integer, Integer> map = new HashMap<>();
            int max = 0;
            for (int i = 0, j = 0; i < arr.length; ++i) {
                if (map.containsKey(arr[i])) {
                    j = Math.max(j, map.get(arr[i]) + 1);
                }
                map.put(arr[i], i);
                max = Math.max(max, i - j + 1);
            }
            return max;
        }

    public static void main(String[] args) {
        System.out.println(maxLength(new int[]{2,2,3,4,3,5}));
    }



}
/*
//队列
我们还可以用一个队列，把元素不停的加入到队列中，
如果有相同的元素，就把队首的元素移除，
这样我们就可以保证队列中永远都没有重复的元素

    public int maxLength(int[] arr) {
        //用链表实现队列，队列是先进先出的
        Queue<Integer> queue = new LinkedList<>();
        int res = 0;
        for (int c : arr) {
            while (queue.contains(c)) {
                //如果有重复的，队头出队
                queue.poll();
            }
            //添加到队尾
            queue.add(c);
            res = Math.max(res, queue.size());
        }
        return res;
    }

 */

/*
同样我们还可以使用集合set来代替队列，用两个指针，一个left一个right，如果有重复的就把left指向的给移除（left相当于队首，right相当于队尾）
    public int maxLength(int[] arr) {
        int maxLen = 0;
        Set<Integer> set = new HashSet<>();
        int left = 0, right = 0;
        while (right < arr.length) {
            while (set.contains(arr[right]))
                set.remove(arr[left++]);
            set.add(arr[right++]);
            maxLen = Math.max(maxLen, right - left);
        }
        return maxLen;
    }

 */


/*
//set方法
    public int maxLength(int[] arr) {
        int left = 0, right = 0, max = 0;
        Set<Integer> set = new HashSet<>();
        while (right < arr.length) {
            if (set.contains(arr[right])) {
                set.remove(arr[left++]);
            } else {
                set.add(arr[right++]);
                max = Math.max(max, set.size());
            }
        }
        return max;
    }
 */